這幾年 JavaScript 已經不只可以寫前端,也可以寫後端程式。如果說要用 JS 來寫後端程式,第一個我會推薦 Koa.js。
雖然後端早期大家可能會選用 Express.js,但我覺得 Koa.js 更好用。Express 內建許多功能,而 Koa 則完全精簡到只剩基本功能,需要的時候仍然可以再找到(甚至自己寫)適合的 Middleware 來搭配。我不覺得 Koa 可以完勝 Express,就像 Python 的 Django 和 Flask 各有人擁護,然而 Koa 在設計的時候就已經考量到 async/await 的優點,相信效率和未來發展會更高。
這篇文章會帶你看一次 Koa 的基本用法,介紹幾個我常用的 Koa Middleware。
如果你還沒安裝 Node.js,可以透過 nvm 來安裝。
首先當然要先新增一個資料夾,然後初始化 Node 專案:
mkdir koa-example-project
cd koa-example-project
npm init -y
接著安裝 Koa:
npm install --save koa
讓我們建立一個 server.js
,並在裡面撰寫一個 Hello world 程式(取自官方範例):
const Koa = require('koa');
const app = new Koa();
// response
app.use(ctx => {
ctx.body = 'Hello Koa';
});
app.listen(3000);
接著可以打開瀏覽器,瀏覽 http://localhost:3000 ,應該可以看到白底黑字寫「Hello Koa」。
剛剛這段程式碼是一開始引入 Koa 套件,並建立一個新的 Koa 實體叫 app
。而 app.use
則是代表 Web 請求會經過這個 function,例如我們把 ctx.body
設為 'Hello Koa'
,HTTP Response 就會回傳這段文字,瀏覽器就會看到這段文字。最後我們讓這個伺服器設在 3000 這個 port,因此我們打開 http://localhost:3000。
通常我們會透過 koa-router
這個 Middleware 去做路由設定。首先安裝 koa-router
:
npm install --save koa-router
接著在 server.js
裡引用 koa-router:
const router = require('koa-router');
假設我們要在 GET /
和 GET /about
顯示不同內容,我們可以這樣寫:
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
router
.get('/', ctx => {
ctx.body = '首頁';
})
.get('/about', ctx => {
ctx.body = '關於頁面';
});
app.use(router.routes());
app.listen(3000);
當然你也可以設定 GET 以外的方法,像是 router.post
、router.delete
等等。
另外,如果前面沒有搭配做別的 reverse proxy 的話(後面的文章會介紹這是什麼),我也會搭配 koa-morgan
來記錄 Log。
npm install --save koa-morgan
然後可以這樣使用:
const accessLogStream = fs.createWriteStream(__dirname + '/access.log',{ flags: 'a' });
app.use(morgan('combined', { stream: accessLogStream }));
把紀錄寫在 access.log 檔案裡面。
morgan 原本是設計給 Express.js 使用的,而 koa-morgan
讓它變成 Koa 的 Middleware。詳細配置 morgan 的話可以參考 官方文件。
基本上 Koa 還可以搭配不同東西做很多事情,未來會再講到怎麼拿 Koa 來寫一個 RESTful API 的後端程式。不過到目前為止應該已經可以寫一些東西了,如果你想丟到線上測試,也可以試試看 Now 這個服務。
本篇文章同步發表在 Noob's Space。